<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>复习柯里化和数组转树</title>
  </head>
  <body>
    <script>
      // 柯里化
      function add(a, b, c, d) {
        return a + b + c + d;
      }

      /* function curry(fun, ...args) {
        let allArgs = [];
        return function (...restArgs) {
          allArgs = [...args, ...restArgs];
          // 如果已经拿完所有参数则执行原函数，反之则继续执行调用curry函数
          if (allArgs.length >= fun.length) {
            return fun.apply(this, allArgs);
          } else {
            return curry(fun, ...allArgs);
          }
        };
      } */

      function curry(fun) {
        const fnLength = fun.length;
        let allArgs = [];
        function inner(...restArgs) {
          // 积累参数保存到闭包中
          allArgs = [...allArgs, ...restArgs];
          if (allArgs.length >= fun.length) {
            return fun.apply(this, allArgs);
          } else {
            return inner;
          }
        }
        return inner;
      }

      const fn = curry(add);
      //   const result = fn(1)(2)(3)(4);
      //   const result = fn(1)(2, 3, 4);
      //   const result = fn(1, 2, 3)(4);
      const result = fn(1, 2)(3, 4);
      console.log('result', result);

      const arr = [
        { id: 1, name: '部门A', parentId: 0 },
        { id: 2, name: '部门B', parentId: 1 },
        { id: 3, name: '部门C', parentId: 1 },
        { id: 4, name: '部门D', parentId: 2 },
        { id: 5, name: '部门E', parentId: 2 },
        { id: 6, name: '部门F', parentId: 3 },
      ];

      // 递归法数组转树
      function arrToTree(arr, parentId, parentKey = 'parentId') {
        const list = arr.filter((item) => {
          return item.parentId === parentId;
        });
        const result = list.map((item) => {
          return {
            ...item,
            children: arrToTree(arr, item.id, parentKey),
          };
        });
        console.log('ls', list);
        return result;
      }
      const tree = arrToTree(arr, 0, 'parentId');
      console.log('tree', tree);

      // 第一次： list: [{ id: 1, name: '部门A', parentId: 0 }] result: [{ id: 1, name: '部门A', parentId: 0,children: arrToTree(arr,1,"parentKey")  }]
      // 第二次： list: [{ id: 2, name: '部门B', parentId: 1 },{ id: 3, name: '部门C', parentId: 1 }] result: [{ id: 2, name: '部门B', parentId: 1,children: arrToTree(arr,2,"parentKey") },{ id: 3, name: '部门C', parentId: 1,arrToTree(arr,3,"parentKey") }]
      // 第三次： list: [{ id: 4, name: '部门D', parentId: 2 },{ id: 5, name: '部门E', parentId: 2 }] result: [{ id: 4, name: '部门D', parentId: 2,children: arrToTree(arr,4,"parentKey") },{ id: 5, name: '部门E', parentId: 2,children: arrToTree(arr,5,"parentKey") }];
      // 第四次： list: [{ id: 6, name: '部门F', parentId: 3 }] result: [{ id: 6, name: '部门F', parentId: 3,chidren: arrToTree(arr,6,"parentKey") }]

      function arrToTreeMap(arr) {
        // 创建映射关系
        const map = new Map();
        // 准备结果数组存储根节点
        let root = [];
        // 遍历原始数组,将每个节点放入 Map 中：map.set(id, node),为每个节点初始化一个空的 children 属性
        arr.forEach((item) => {
          const node = {
            ...item,
            children: [],
          };
          map.set(item.id, node);
          const currentNode = map.get(item.id);
          const parentNode = map.get(item.parentId);
          if (parentNode) {
            parentNode.children.push(currentNode);
          } else {
            root.push(currentNode);
          }
        });
        return root;

        // arr.forEach((item) => {
        //   // 找当前的节点
        //   const currentNode = map.get(item.id);
        //   // 找当前节点的父id
        //   const parentId = item.parentId;
        //   if (parentId && map.has(parentId)) {
        //     const parentNode = map.get(parentId);
        //     parentNode.children.push(currentNode);
        //   } else {
        //     // 没有父节点，则作为根节点
        //     root.push(currentNode);
        //   }
        // });
        return root;
      }
      console.log('treeMap', arrToTreeMap(arr));
    </script>
  </body>
</html>
